/*******************************************************************************
 * FilePath    : \Software\Examples\MS1656_app_UART\Src\User\AH_Ble.c
 * Version     : 1.0
 * Brief       : 
 * Author      : AndrewHu
 * Company     : Shanghai MacroGiga Electronics CO.,Ltd
 * Email       : Hubinbo@macrogiga.com
 * Date        : 2020-04-03 15:06:14
 * LastEditors : AndrewHu
 * LastEditTime: 2020-09-16 17:09:20
 * Description : 
 ******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include <Includes.h>
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define notify_data_MAX 200
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
static u8 gAdvFlag = 1; //广播使能标志
static u8 bleMode = 1;  //蓝牙工作模式，0-透传，1-AT命令
static u16 bleAdvIn;
static u8 ble_mac_addr[6];
static u8 ble_adv_data[32]; //最后一个字节存广播数据长度
//数据传输
u8 notify_index_in = 0x00;
u8 notify_index_out = 0x00;
u8 notify_data[notify_data_MAX] = {0}; //notify缓存
/* Private function ----------------------------------------------------------*/
/* extern --------------------------------------------------------------------*/
extern u16 cur_notifyhandle;
extern u8 DeviceInfo[];

/*******************************************************************************
 * Function    : SetBleAdvInterval
 * Brief       : 设定广播间隔
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-22 11:52:15
 * Description : 
 ******************************************************************************/
void SetBleAdvInterval(u16 interval)
{
    bleAdvIn = interval;
}
/*******************************************************************************
 * Function    : GetBleAdvInterval
 * Brief       : 获取广播间隔
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-22 11:53:44
 * Description : 
 ******************************************************************************/
u16 GetBleAdvInterval(void)
{
    return bleAdvIn;
}
/*******************************************************************************
 * Function    : GetAdvData
 * Brief       : 获取广播内容
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-22 12:20:36
 * Description : 
 ******************************************************************************/
u8 *GetAdvData(void)
{
    return ble_adv_data;
}
/*******************************************************************************
 * Function    : SetAdvData
 * Brief       : 设定广播内容
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-22 12:25:51
 * Description : 
 ******************************************************************************/
u8 SetAdvData(u8 *data, u8 len)
{
    if (len <= 31)
    {
        // ble_set_adv_type(ADV_HDR_TYPE_PUBLIC_IND); //设定广播类型
        memcpy(ble_adv_data, data, len);
        ble_adv_data[31] = len;
        ble_set_adv_data(ble_adv_data, len); //设定广播包内容
        return 0;
    }
    else
        return 1;
}
/*******************************************************************************
 * Function    : getBleAddr
 * Brief       : 获取MAC地址
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-06 14:56:45
 * Description : 
 ******************************************************************************/
u8 *getBleAddr(void)
{
    return ble_mac_addr;
}
/*******************************************************************************
 * Function    : SetBleAddr
 * Brief       : 
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-23 17:22:59
 * Description : 
 ******************************************************************************/
void SetBleAddr(u8 *addr)
{
    memcpy(ble_mac_addr, addr, 6);
    radio_setBleAddr(addr);
}
/*******************************************************************************
 * Function    : 
 * Brief       : 
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-03-23 16:40:53
 * Description : 将MAC地址写入名称字段内
 ******************************************************************************/
void WriteMacAddr(u8 *addr)
{
    //将mac地址写入名称字段内
    DeviceInfo[8] = Hex2Ascii(addr[5] >> 4);
    DeviceInfo[9] = Hex2Ascii(addr[5] & 0x0f);
    DeviceInfo[10] = Hex2Ascii(addr[4] >> 4);
    DeviceInfo[11] = Hex2Ascii(addr[4] & 0x0f);
    DeviceInfo[12] = Hex2Ascii(addr[3] >> 4);
    DeviceInfo[13] = Hex2Ascii(addr[3] & 0x0f);
    DeviceInfo[14] = Hex2Ascii(addr[2] >> 4);
    DeviceInfo[15] = Hex2Ascii(addr[2] & 0x0f);
    DeviceInfo[16] = Hex2Ascii(addr[1] >> 4);
    DeviceInfo[17] = Hex2Ascii(addr[1] & 0x0f);
    DeviceInfo[18] = Hex2Ascii(addr[0] >> 4);
    DeviceInfo[19] = Hex2Ascii(addr[0] & 0x0f);
    DeviceInfo[0] = 19; //名称长度
    ble_set_name(DeviceInfo, 19);
}
/*******************************************************************************
 * Function    : Ble_Init
 * Brief       : 蓝牙初始化
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-03 17:11:42
 * Description : 
 ******************************************************************************/
void Ble_Init(void)
{
    unsigned char *const ft_val = (unsigned char *)0x18000040;
    unsigned char ft_value[2] = {0xc0, 0x12};
    u8 *mac_addr;
    u8 i;
    u8 temp = 0x00;

    SetBleIntRunningMode();
    radio_initBle(TXPWR_0DBM, &mac_addr); //设置发射功率，返回蓝牙Mac地址指针

    //FT应用
    if ((*ft_val > 11) && (*ft_val < 25))
    {
        ft_value[1] = *ft_val;
        mg_activate(0x53);
        mg_writeBuf(0x4, ft_value, 2);
        mg_activate(0x56);
    }

    for (i = 0; i < 6; i++)
    {
        temp |= ble_mac_addr[i];
    }
    if (temp == 0x00)
    {
        SetBleAddr(mac_addr);
        WriteMacAddr(ble_mac_addr); //将MAC地址加入设备名
    }
    else
        SetBleAddr(ble_mac_addr);

    ble_set_feature_supported(0);                     //
    ble_set_adv_data(ble_adv_data, ble_adv_data[31]); //设定广播包内容
    // ble_set_adv_rsp_data(dat_adv,sizeof(dat_adv));//设定广播反馈包
    // ble_set_adv_type(ADV_HDR_TYPE_PUBLIC_IND);//设定广播类型
    // SetFixAdvChannel(1); //只在37通道发送广播，调试用
}
/*******************************************************************************
 * Function    : 
 * Brief       : 获取广播使能状态
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-06 01:49:31
 * Description : 
 ******************************************************************************/
u8 getBleMode(void)
{
    return bleMode;
}
/*******************************************************************************
 * Function    : 
 * Brief       : 获取广播使能状态
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-06 01:49:31
 * Description : 
 ******************************************************************************/
void setBleMode(u8 mode)
{
    bleMode = mode;
}
/*******************************************************************************
 * Function    : getAdvFlag
 * Brief       : 获取广播使能状态
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-06 01:49:31
 * Description : 
 ******************************************************************************/
u8 getAdvFlag(void)
{
    return gAdvFlag;
}
/*******************************************************************************
 * Function    : 
 * Brief       : 设定广播状态
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-06 01:50:30
 * Description : 
 ******************************************************************************/
void setAdvFlag(u8 flag)
{
    gAdvFlag = flag;
    ble_set_adv_enableFlag(flag);
}

/*******************************************************************************
 * Function    : getBleUartRxHandle
 * Brief       : 
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-04 13:56:37
 * Description : 获取透传句柄
 ******************************************************************************/
u16 getBleUartRxHandle(void)
{
    return BleRxHandle;
}
/*******************************************************************************
 * Function    : setNotifyHandle
 * Brief       : 
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-04 13:56:37
 * Description : 设置Notify句柄
 ******************************************************************************/
void setNotifyHandle(u16 handle)
{
    cur_notifyhandle = handle;
}
/*******************************************************************************
 * Function    : SendNotifyData
 * Brief       : 蓝牙串口发送数据缓存
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-20 19:27:50
 * Description : 
 ******************************************************************************/
void SendNotifyData(u8 *data, u8 len)
{
    u8 i = 0;
    for (i = 0; i < len; i++)
    {
        notify_data[notify_index_in] = data[i];
        notify_index_in++;
        if (notify_index_in >= notify_data_MAX)
            notify_index_in = 0;
    }
}
/*******************************************************************************
 * Function    : NotifyRun
 * Brief       : 蓝牙串口发送数据
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-20 18:56:01
 * Description : 
 ******************************************************************************/
void NotifyRun(void)
{
    u8 length = 0, i = 0;
    u8 data[20];
    if (GetConnectedStatus() == 0)
    {
        notify_index_out = notify_index_in;
        return;
    }

    if (notify_index_in > notify_index_out)
        length = notify_index_in - notify_index_out;
    else if (notify_index_in == notify_index_out)
        return;
    else
        length = notify_data_MAX - notify_index_out + notify_index_in;

    if (length >= 20)
        length = 20;

    //取字节发送
    for (i = 0; i < length; i++)
    {
        data[i] = notify_data[notify_index_out];
        notify_index_out++;
        if (notify_index_out >= notify_data_MAX)
            notify_index_out = 0x00;
    }

    setNotifyHandle(BleRxHandle); //调用sconn_notifydata函数前一定要设定正确的句柄
    sconn_notifydata(data, length);
}
